package com.bnz.servlet;

import com.alibaba.fastjson.JSON;
import com.bnz.entity.Student;
import com.bnz.entity.vo.StudentVo;
import com.bnz.service.StudentService;
import com.bnz.util.PageResult;
import com.bnz.util.R;
import com.github.pagehelper.util.StringUtil;
import org.springframework.util.StringUtils;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

@WebServlet("/stu")
public class StuServlet extends HttpServlet {
    // 引入StudentService
    private StudentService studentService;

    // 重写初始化方法(程序一执行,就先执行这里的命令)
    @Override
    public void init() throws ServletException {
        // 1、拿到spring容器
        WebApplicationContext wac = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
        // 2、得到容器中的bean,并赋值给studentService
        studentService = wac.getBean(StudentService.class);

    }


    // 重写service方法
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、处理中文乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        // 2、获取请求参数(前端路径中带有的参数cmd=...)
        String cmd = req.getParameter("cmd");
        // 3、根据获取到的cmd的值,进行不同的操作,前提是不为空
        if (!StringUtils.isEmpty(cmd)) { // 得到的cmd不为空
            // 3.1、cmd=list,查询全部数据
            if ("list".equals(cmd)) {
                list(req, resp);
            }
            // 3.2、cmd=findByPage,分页查询
            if("findByPage".equals(cmd)){
                findByPage(req,resp);
            }
            // 3.3、cmd=search,条件查询
            if ("search".equals(cmd)){
                search(req,resp);
            }
            // 3.4、cmd=add,添加数据
            if("add".equals(cmd)){
                add(req,resp);
            }
            // 3.5、cmd=update,修改数据
            if("update".equals(cmd)){
                update(req,resp);
            }
            // 3.6、cmd=delete,删除数据
            if("delete".equals(cmd)){
                delete(req,resp);
            }
        }
    }


    // 1、查询全部数据
    private void list(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 1.1、创建findAll()方法,查询所有数据
        List<Student> list = studentService.findALL();
        // 1.2、利用统一返回工具类,统一传输值给前端
        R r = R.ok().data("list", list);
        // 1.3、讲查询到的数据,转换为json串,并输出到网页
        resp.getWriter().println(JSON.toJSONString(r));
        // 1.4、进行刷新
        resp.getWriter().flush();
    }

    // 2、分页查询
    private void findByPage(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 2.1、获取当前页数和每页的数据量
        String paged = req.getParameter("page");
        String pagesized = req.getParameter("pagesize");
        // 2.2、判断是否有传页数与每页数量,判断是否赋予默认值
        int page = !StringUtils.isEmpty(paged) ? new Integer(paged) : 1;
        int pagesize = !StringUtils.isEmpty(pagesized) ? new Integer(pagesized) : 3;
        // 2.3、开始分页
        PageResult<Student> pr =  studentService.findByPage(page,pagesize);
        // 2.4、转换为json串,并输出到网页
        resp.getWriter().println(JSON.toJSONString(R.ok().data("pr",pr)));
        // 2.5、进项刷新
        resp.getWriter().flush();
    }

    // 3、条件查询
    private void search(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 3.1、获取当前页数和每页的数据量
        String paged = req.getParameter("page");
        String pagesized = req.getParameter("pagesize");
        // 3.2、判断是否有传页数与每页数量,判断是否赋予默认值
        int page = !StringUtils.isEmpty(paged) ? new Integer(paged) : 1;
        int pagesize = !StringUtils.isEmpty(pagesized) ? new Integer(pagesized) : 3;
        // 3.3、获取条件查询对象（前端传的）
        String stud = req.getParameter("stud");
        // 3.4、如果获取的不为空
        if (!StringUtils.isEmpty(stud)){
            // 3.4.1、转换为中文
            stud = new String(stud.getBytes("iso8859-1"),"UTF-8");
            // 3.4.2、然后，再转换为对象
            StudentVo vo = JSON.parseObject(stud,StudentVo.class);
            // 3.4.3、开始分页查询
            PageResult<Student> pr = studentService.search(page,pagesize,vo);
            // 3.4.4、转换为json串，并输出到网页
            resp.getWriter().println(JSON.toJSONString(R.ok().data("pr",pr)));
            resp.getWriter().flush(); // 刷新
        }
    }

    // 4、添加数据
    private void add(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 4.1、定义一个空的字符串对象
        String info = "";
        try {
            // 4.2、得到添加对象（前端传输的）
            String stud = req.getParameter("stud");
            // 4.3、转换为中文格式
            stud = new String(stud.getBytes("iso8859-1"),"UTF-8");
            // 4.4、学生实体对象
            Student student = JSON.parseObject(stud, Student.class);
            // 4.5、添加方法
            studentService.add(student);
            // 4.6、将其转换为json串，用于网页输出
            info = JSON.toJSONString(R.ok().message("添加成功"));
        }catch (Exception e){
            info = JSON.toJSONString(R.error().message("添加失败"));
            e.printStackTrace();
        }
        // 4.7、将其输出到网页
        resp.getWriter().println(info);
        // 4.8、刷新
        resp.getWriter().flush();
    }

    // 5、修改
    private void update(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        String info = ""; // 定义一个空字符串
        try {
            // 5.1、得到要添加的字符串（前端传）
            String stud = req.getParameter("stud");
            // 5.2、转换为中文格式（防止传输不了）
            stud = new String(stud.getBytes("iso8859-1"),"UTF-8");
            // 5.3、转换为学生实体对象
            Student student = JSON.parseObject(stud,Student.class);
            // 5.4、修改学生
            studentService.update(student);
            // 5.5、转换json串
            info = JSON.toJSONString(R.ok().message("修改成功!"));

        } catch (UnsupportedEncodingException e) {
            info = JSON.toJSONString(R.error().message("修改失败!"));
            e.printStackTrace();
        }
        // 5.6、输出到网页
        resp.getWriter().println(info);
        // 5.7、刷新
        resp.getWriter().flush();
    }

    // 6、删除数据
    private void delete(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        // 6.1、定义一个空字符串对象
        String info = "";
        try {
            // 6.1、得到要删除的学生数组（前端纯过来的路劲中数据）
            String sidstr = req.getParameter("sids");
            // 6.2、拆分数组
            String[] sids = sidstr.split(",");
            // 6.3、将字符串数组转换为List<Integer>集合
            List<Integer> collect = Arrays.stream(sids).map(m -> Integer.parseInt(m)).collect(Collectors.toList());
            // 6.4、删除学生
            studentService.delete(collect);
            // 6.5、调用R统一返回值，并转换为json串
            info = JSON.toJSONString(R.ok().message("删除成功"));
        } catch (Exception e){
            e.printStackTrace();
            info = JSON.toJSONString(R.error().message("删除失败"));

        }
        // 6.6、输出到网页
        resp.getWriter().println(info);
        // 6.7、进项刷新
        resp.getWriter().flush();
    }

}
